14677
14379
تريد تحسين هذا المنشور؟ قدم إجابات مفصلة على هذا السؤال ، بما في ذلك الاستشهادات وشرح سبب صحة إجابتك. يمكن تحرير أو حذف الإجابات التي لا تحتوي على تفاصيل كافية.
لقد أضفت ملفات عن طريق الخطأ إلى Git باستخدام الأمر:
بوابة إضافة myfile.txt
لم أقم بتشغيل git الالتزام. هل هناك طريقة للتراجع عن هذا ، بحيث لا يتم تضمين هذه الملفات في الالتزام؟ 
1
2
التالى
يمكنك التراجع عن git add قبل الالتزام بـ
إعادة تعيين بوابة <ملف>
والتي ستزيله من الفهرس الحالي (قائمة "على وشك الالتزام") دون تغيير أي شيء آخر.
يمكنك استخدام
إعادة تعيين بوابة
بدون أي اسم ملف لإلغاء جميع التغييرات المستحقة. يمكن أن يكون هذا مفيدًا عندما يكون هناك عدد كبير جدًا من الملفات ليتم سردها واحدًا تلو الآخر في فترة زمنية معقولة.
في الإصدارات القديمة من Git ، تكافئ الأوامر المذكورة أعلاه git reset HEAD  و git reset HEAD على التوالي ، وستفشل إذا كان HEAD غير محدد (لأنك لم تقم حتى الآن بأي التزامات في مستودعك) أو غامضة (لأنك إنشاء فرع يسمى HEAD ، وهو شيء غبي لا يجب عليك فعله). تم تغيير هذا في Git 1.8.2 ، ومع ذلك ، في الإصدارات الحديثة من Git يمكنك استخدام الأوامر المذكورة أعلاه حتى قبل إجراء الالتزام الأول:
يتم استخدام "git reset" (بدون خيارات أو معلمات) لإخراج الخطأ عند
ليس لديك أي التزامات في تاريخك ، لكنها تمنحك الآن
فهرس فارغ (لمطابقة الالتزام غير الموجود الذي لم تقم حتى بتشغيله).
التوثيق: git reset
|
انت تريد:
git rm - مؤقتًا 
منطق:
عندما كنت جديدًا على هذا ، حاولت أولاً
إعادة تعيين بوابة.
(للتراجع عن إضافتي الأولية بالكامل) ، فقط للحصول على هذه الرسالة المفيدة (ليست كذلك):
فادح: فشل حل "HEAD" كمرجع صالح.
اتضح أن هذا بسبب عدم وجود المرجع HEAD (الفرع؟) إلا بعد الالتزام الأول. وهذا يعني أنك ستواجه نفس مشكلة المبتدئين مثلي إذا كان سير العمل الخاص بك ، مثل لي ، شيئًا مثل:
cd إلى دليل مشروعي الجديد الرائع لتجربة Git ، السخونة الجديدة
بوابة الحرف الأول
إضافة بوابة.
حالة بوابة
... الكثير من مخطوطات حماقة ...
=> اللعنة ، لم أرغب في إضافة كل ذلك.
google "تراجع عن git add"
=> ابحث عن Stack Overflow - yay
إعادة تعيين بوابة.
=> فادح: فشل حل "HEAD" كمرجع صالح.
اتضح أيضًا أن هناك خطأ تم تسجيله ضد عدم فائدة هذا في القائمة البريدية.
وأن الحل الصحيح كان موجودًا هناك في مخرجات حالة Git (والتي ، نعم ، لمستها على أنها "حماقة")
...
# التغييرات الواجب الالتزام بها:
# (استخدم "git rm --cached  ..." لإلغاء المرحلة)
...
والحل بالفعل هو استخدام git rm --cached FILE.
لاحظ التحذيرات في مكان آخر هنا - يحذف git rm نسخة العمل المحلية من الملف ، ولكن ليس إذا كنت تستخدم - cached. هذه نتيجة git help rm:
- مخبأ
استخدم هذا الخيار لإلغاء التدريج وإزالة المسارات من الفهرس فقط.
سيتم ترك ملفات شجرة العمل ، سواء تم تعديلها أم لا.
أشرع في استخدام
بوابة rm - مؤقت.
لإزالة كل شيء والبدء من جديد. لم ينجح رغم ذلك ، لأنه أثناء إضافة. هو تكراري ، اتضح أن rm يحتاج إلى تكرار. تنهد.
بوابة rm -r-- مؤقتًا.
حسنًا ، لقد عدت الآن إلى حيث بدأت. في المرة القادمة سأستخدم -n لإجراء تشغيل جاف ومعرفة ما سيتم إضافته:
بوابة add -n.
لقد قمت بضغط كل شيء إلى مكان آمن قبل الوثوق بـ git help rm حول - عدم تدمير أي شيء مؤقتًا (وماذا لو أخطأت في تهجئته).
|
إذا كتبت:
حالة بوابة
سيخبرك Git بما هو مرحلي ، وما إلى ذلك ، بما في ذلك إرشادات حول كيفية إلغاء المسرح:
استخدم "git reset HEAD  ..." لإلغاء المرحلة
أجد أن Git يقوم بعمل جيد جدًا في حثني على فعل الشيء الصحيح في مثل هذه المواقف.
ملاحظة: أحدثت إصدارات Git (1.8.4.x) تغييرًا لهذه الرسالة:
(استخدم "git rm --cached  ..." لإلغاء المرحلة)
|
للتوضيح: git add ينقل التغييرات من دليل العمل الحالي إلى منطقة التدريج (index).
هذه العملية تسمى التدريج. لذا فإن الأمر الأكثر طبيعية لتنظيم التغييرات (الملفات المتغيرة) هو الأمر الواضح:
مرحلة البوابة
git add هو مجرد اسم مستعار يسهل كتابته لمرحلة git
من المؤسف أنه لا توجد أوامر git unstage ولا git unadd. يصعب تخمين أو تذكر الشخص ذي الصلة ، لكنه واضح جدًا:
git إعادة تعيين HEAD -
يمكننا بسهولة إنشاء اسم مستعار لهذا:
git config - global alias.unadd "إعادة تعيين الرأس -"
git config - global alias.unstage "إعادة تعيين الرأس -"
وأخيرًا ، لدينا أوامر جديدة:
بوابة إضافة file1
بوابة المرحلة file2
بوابة unadd file2
بوابة unstage file1
أنا شخصياً أستخدم أسماء مستعارة أقصر:
git a # للتدريج
git u # لإلغاء التدريج
|
إضافة إلى الإجابة المقبولة ، إذا كان الملف الذي أضفته عن طريق الخطأ ضخمًا ، فربما تلاحظ أنه حتى بعد إزالته من الفهرس باستخدام "git reset" ، يبدو أنه لا يزال يشغل مساحة في دليل .git.
هذا لا يدعو للقلق ؛ الملف لا يزال بالفعل في المستودع ، ولكن فقط "ككائن فضفاض". لن يتم نسخها إلى مستودعات أخرى (عبر استنساخ ، دفع) ، وستتم استعادة المساحة في النهاية - على الرغم من أنه ربما ليس قريبًا جدًا. إذا كنت قلقًا ، يمكنك تشغيل:
git gc --prune = الآن
تحديث (ما يلي هو محاولتي لإزالة بعض الالتباس الذي قد ينشأ من الإجابات الأكثر تصويتًا):
إذن ، ما هو التراجع الحقيقي عن git add؟
git إعادة تعيين HEAD <ملف>؟
أو
git rm - مؤقت <ملف>؟
بالمعنى الدقيق للكلمة ، وإذا لم أكن مخطئًا: لا شيء.
لا يمكن التراجع عن إضافة git - بشكل آمن بشكل عام.
لنتذكر أولاً ما يفعله الأمر git add  في الواقع:
إذا لم يتم تتبع  مسبقًا ، فقم بإضافته إلىذاكرة التخزين المؤقت بمحتواها الحالي.
إذا تم تعقب <ملف> بالفعل ، فإن الأمر git add يحفظ المحتوى الحالي (لقطة ، إصدار) إلى ذاكرة التخزين المؤقت. في Git ، لا يزال هذا الإجراء يسمى add ، (وليس مجرد تحديثه) ، لأن نسختين مختلفتين (لقطات) من الملف تعتبر عنصرين مختلفين: وبالتالي ، فإننا بالفعل نضيف عنصرًا جديدًا إلى ذاكرة التخزين المؤقت ، ليكون في النهاية ارتكبت في وقت لاحق.
في ضوء ذلك ، فإن السؤال غامض بعض الشيء:
لقد أضفت ملفات عن طريق الخطأ باستخدام الأمر ...
يبدو أن سيناريو OP هو الأول (ملف لم يتم تعقبه) ، نريد "التراجع" لإزالة الملف (وليس فقط المحتويات الحالية) من العناصر المتعقبة. إذا كانت هذه هي الحالة ، فلا بأس بتشغيل الأمر git rm --cached .
ويمكننا أيضًا تشغيل git reset HEAD <ملف>. يُفضل هذا بشكل عام ، لأنه يعمل في كلا السيناريوهين: كما أنه يقوم بالتراجع عندما نضيف بشكل خاطئ إصدارًا من عنصر تم تعقبه بالفعل.
لكن هناك نوعان من المحاذير.
أولاً: هناك (كما هو موضح في الإجابة) سيناريو واحد فقط لا يعمل فيه git reset HEAD ، ولكن git rm --cached يعمل: مستودع جديد (بدون التزامات) لكن ، في الحقيقة ، هذه حالة غير ذات صلة عمليًا.
ثانيًا: كن على علم بأن git reset HEAD لا يمكنها استرداد محتويات الملف المخزنة مؤقتًا مسبقًا بطريقة سحرية ، بل تقوم فقط بإعادة مزامنتها من HEAD. إذا تمت إضافة git المضللة إلى الكتابة فوق إصدار مرحلي سابق غير ملتزم به ، فلا يمكننا استعادته. لهذا السبب ، بالمعنى الدقيق للكلمة ، لا يمكننا التراجع عن [*].
مثال:
مدخل $ git
$ echo "الإصدار 1"> file.txt
$ git add file.txt # أول إضافة من file.txt
$ git الالتزام -m "الالتزام الأول"
$ echo "الإصدار 2"> file.txt
$ git add file.txt # Stage (عدم الالتزام) "الإصدار 2" من file.txt
$ git diff - file.txt مؤقتًا
-النسخة 1
+ الإصدار 2
$ echo "الإصدار 3"> file.txt
git فرق $ file.txt
-الإصدار 2
+ الإصدار 3
$ git add file.txt # عفوًا ، لم نعني هذا
$ git إعادة تعيين HEAD file.txt # تراجع؟
$ git diff - file.txt # مؤقتًا لا يوجد فرق بالطبع. المرحلة == الرأس
$ git diff file.txt # لقد فقدنا "الإصدار 2" نهائيًا
-النسخة 1
+ الإصدار 3
بالطبع ، هذا ليس بالغ الأهمية إذا اتبعنا فقط سير العمل البطيء المعتاد للقيام بـ 'git add' فقط لإضافة ملفات جديدة (الحالة 1) ، وقمنا بتحديث المحتويات الجديدة عبر أمر الالتزام ، git الالتزام -a.
* (تعديل: ما سبق صحيح عمليًا ، ولكن لا يزال هناك بعض الطرق المخترقة / المعقدة قليلاً لاستعادة التغييرات التي تم إجراؤها على مراحل ، ولكن لم يتم الالتزام بها ثم الكتابة فوقها - راجع تعليقات يوهانس ماتوكيتش و iolsmit)
|
التراجع عن ملف تمت إضافته بالفعل سهل للغاية باستخدام Git. لإعادة ضبط myfile.txt ، الذي تمت إضافته بالفعل ، استخدم:
git إعادة تعيين HEAD myfile.txt
تفسير:
بعد تنظيم الملفات غير المرغوب فيها ، للتراجع ، يمكنك إجراء إعادة تعيين. رأس الملف الخاص بك في المحلية والمعلمة الأخيرة هو اسم الملف الخاص بك.
لقد قمت بإنشاء الخطوات في الصورة أدناه بمزيد من التفاصيل لك ، بما في ذلك جميع الخطوات التي قد تحدث في هذه الحالات:
|
بوابة rm - مؤقت. -r
سيقوم "بإلغاء" كل ما قمت بإضافته من دليلك الحالي بشكل متكرر
|
يركض
بوابة غوي
وقم بإزالة جميع الملفات يدويًا أو عن طريق تحديدها جميعًا والنقر على زر إلغاء التدوير من التنفيذ.
|
لم يتم طرح السؤال بوضوح. والسبب أن git add لها معنيان:
إضافة ملف جديد إلى منطقة التدريج ، ثم التراجع باستخدام git rm - الملف المؤقت.
إضافة ملف معدل إلى منطقة التدريج ، ثم التراجع باستخدام ملف git reset HEAD.
إذا كنت في شك ، استخدم
git إعادة تعيين ملف HEAD
لأنه يفعل الشيء المتوقع في كلتا الحالتين.
تحذير: إذا قمت بإجراء الأمر git rm - ملفًا مؤقتًا في ملف تم تعديله (ملف كان موجودًا من قبل في المستودع) ، فسيتم حذف الملف في git الالتزام! سيظل موجودًا في نظام الملفات الخاص بك ، ولكن إذا قام أي شخص آخر بسحب الالتزام ، فسيتم حذف الملف من شجرة العمل الخاصة به.
ستخبرك حالة git ما إذا كان الملف جديدًا أم تم تعديله:
على رئيس الفرع
التغييرات الواجب الالتزام بها:
(استخدم "git reset HEAD  ..." لإلغاء المرحلة)
الملف الجديد: my_new_file.txt
تم التعديل: my_modified_file.txt
|
لدى Git أوامر لكل إجراء يمكن تخيله ، لكنه يحتاج إلى معرفة واسعة لتصحيح الأمور وبسبب ذلك فهو غير بديهي في أحسن الأحوال ...
ماذا فعلت من قبل:
تم تغيير ملف واستخدام git add. أو git add .
ماتريد:
قم بإزالة الملف من الفهرس ، ولكن احتفظ بإصداره وتركه مع التغييرات غير الملتزم بها في نسخة العمل:
git reset HEAD <ملف>
أعد تعيين الملف إلى الحالة الأخيرة من HEAD ، والتراجع عن التغييرات وإزالتها من الفهرس:
# فكر في `svn revert ` IIRC.
git إعادة تعيين HEAD <ملف>
بوابة الخروج <ملف>
# إذا كان لديك `` باسم `` ، فاستخدم:
بوابة الخروج - <ملف>
هذا ضروري لأن git reset - hard HEAD لن يعمل مع الملفات الفردية.
قم بإزالة  من الفهرس والإصدارات ، مع الاحتفاظ بالملف بدون إصدار مع التغييرات في نسخة العمل:
git rm - مؤقت <ملف>
قم بإزالة <ملف> من نسخة العمل وتعيين الإصدار تمامًا:
git rm <ملف>
|
إذا كنت في الالتزام الأولي ولا يمكنك استخدام gitإعادة تعيين ، فقط أعلن "إفلاس Git" وحذف مجلد .git وابدأ من جديد
|
وفقًا للعديد من الإجابات الأخرى ، يمكنك استخدام git reset
لكن:
لقد وجدت هذا المنشور الصغير الرائع الذي يضيف أمر Git (حسنًا ، اسم مستعار) لـ git unadd: انظر git unadd للحصول على التفاصيل أو ..
ببساطة،
git config - global alias.unadd "إعادة تعيين الرأس"
الآن انت تستطيع
بوابة unadd foo.txt bar.txt
|
استخدم git add -i لإزالة الملفات المضافة للتو من التنفيذ القادم. مثال:
إضافة الملف الذي لا تريده:
$ git add foo
حالة $ git
# على رئيس الفرع
# التغييرات الواجب الالتزام بها:
# (استخدم "git reset HEAD  ..." لإلغاء المرحلة)
#
# ملف جديد: foo
#
# ملفات لم يتم تعقبها:
# (استخدم "git add  ..." لتضمينه في ما سيتم الالتزام به)
# [...] #
الانتقال إلى الإضافة التفاعلية للتراجع عن إضافتك (الأوامر التي تمت كتابتها في git هنا هي "r" (عودة) ، و "1" (يظهر الإدخال الأول في القائمة ، و "رجوع" للخروج من وضع العودة ، و "q" (استقال):
$ git add -i
مسار غير منظم
1: + 1 / -0 لا شيء
*** أوامر ***
1: [s] tatus 2: [u] pdate 3: [r] evert 4: [a] dd untracked
5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp
ماذا الآن> ص
مسار غير منظم
1: + 1 / -0 لا شيء [و] س س
عودة >> 1
مسار غير منظم
* 1: + 1 / -0 لا شيء [و] س س
عودة >>
ملاحظة: لم يتم تعقب foo الآن.
عادت مسارًا واحدًا
*** أوامر ***
1: [s] tatus 2: [u] pdate 3: [r] evert 4: [a] dd untracked
5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp
ماذا الآن> q
وداعا.
$
هذا هو! هذا هو الدليل الذي يوضح أن "foo" قد عاد إلى القائمة التي لم يتم تتبعها:
حالة $ git
# على رئيس الفرع
# ملفات لم يتم تعقبها:
# (استخدم "git add  ..." لتضمينه في ما سيتم الالتزام به)
# [...]
# foo
لم تتم إضافة أي شيء للالتزام ولكن الملفات التي لم يتم تعقبها موجودة (استخدم "git add" للتتبع)
$
|
يمكن استخدام git remove أو git rm لهذا الغرض ، مع العلم --cached. محاولة:
بوابة مساعدة جمهورية مقدونيا
|
إليك طريقة لتجنب هذه المشكلة المزعجة عند بدء مشروع جديد:
أنشئ الدليل الرئيسي لمشروعك الجديد.
قم بتشغيل git init.
الآن قم بإنشاء ملف .gitignore (حتى لو كان فارغًا).
قم بتنفيذ ملف .gitignore الخاص بك.
يجعل Git من الصعب فعلاً إعادة تعيين git إذا لم يكن لديك أي التزامات. إذا أنشأت التزامًا أوليًا صغيرًا فقط من أجل الحصول على واحد ، فيمكنك بعد ذلك الحصول على إضافة -A وإعادة تعيين git عدة مرات كما تريد من أجل الحصول على كل شيء بشكل صحيح.
ميزة أخرى لهذه الطريقة هي أنه إذا واجهت مشاكل نهاية السطر لاحقًا وتحتاج إلى تحديث جميع ملفاتك ، فمن السهل:
تحقق من الالتزام الأولي. سيؤدي هذا إلى إزالة جميع ملفاتك.
ثم تحقق من الالتزام الأخير مرة أخرى. سيؤدي هذا إلى استرداد نسخ حديثة من ملفاتك ، باستخدام إعدادات نهاية السطر الحالية.
|
ربما تطورت Git منذ أن نشرت سؤالك.
$> git - الإصدار
إصدار git 1.6.2.1
الآن يمكنك أن تجرب:
بوابة إعادة تعيين الرأس.
يجب أن يكون هذا ما تبحث عنه.
|
لاحظ أنه إذا فشلت في تحديد مراجعة ، فيجب عليك تضمين فاصل. مثال من وحدة التحكم الخاصة بي:
إعادة تعيين بوابة 
فادح: وسيطة غامضة '': مراجعة أو مسار غير معروف ليس في شجرة العمل.
استخدم "-" لفصل المسارات عن المراجعات
إعادة تعيين بوابة - 
التغييرات غير المُدرجة بعد إعادة التعيين:
م 
(Git الإصدار 1.7.5.4)
|
لإزالة الملفات الجديدة من منطقة التدريج (وفقط في حالة وجود ملف جديد) ، كما هو مقترح أعلاه:
git rm - ملف مؤقت
استخدم rm - مؤقتًا فقط للملفات الجديدة المضافة عن طريق الخطأ.
|
لإعادة تعيين كل ملف في مجلد معين (ومجلداته الفرعية) ، يمكنك استخدام الأمر التالي:
إعادة تعيين بوابة *
|
استخدم الأمر * للتعامل مع ملفات متعددة في وقت واحد:
إعادة تعيين بوابة HEAD * .prj
إعادة تعيين بوابة HEAD * .bmp
إعادة تعيين بوابة HEAD * gdb *
إلخ
|
ما عليك سوى كتابة git reset ، وسوف يعود الأمر كما لو لم تكتب git add. منذ آخر التزام لك. تأكد من أنك قد ارتكبت من قبل.
|
لنفترض أنني قمت بإنشاء ملف جديد ، newFile.txt:
لنفترض أنني أضفت الملف عن طريق الخطأ ، فقم بإضافة newFile.txt:
الآن أريد التراجع عن هذه الإضافة ، قبل الالتزام ، git reset newFile.txt:
|
لملف معين:
git إعادة تعيين my_file.txt
بوابة الخروج my_file.txt
لكافة الملفات المضافة:
إعادة تعيين بوابة.
بوابة الخروج.
ملاحظة: يغير السحب الكود في الملفات وينتقل إلى آخر حالة تم تحديثها (الالتزام). إعادة تعيين لا يغير الرموز ؛ يقوم فقط بإعادة تعيين الرأس.
|
للتراجع عن إضافة الأمر ، استخدم:
إعادة تعيين اسم الملف git
|
سيؤدي هذا الأمر إلى إلغاء تخزين تغييراتك:
git إعادة تعيين HEAD filename.txt
تستطيع ايضا استخذام
git add -p
لإضافة أجزاء من الملفات.
|
يوجد أيضًا وضع تفاعلي:
git add -i
اختر الخيار 3 لإلغاء إضافة الملفات. في حالتي ، غالبًا ما أرغب في إضافة أكثر من ملف ، وباستخدام الوضع التفاعلي ، يمكنك استخدام أرقام مثل هذه لإضافة ملفات. سيستغرق هذا الكل ما عدا 4: 1 و 2 و 3 و 5
لاختيار تسلسل ، اكتب فقط 1-5 لتأخذ الكل من 1 إلى 5.
ملفات التدريج Git
|
git add myfile.txt # سيؤدي ذلك إلى إضافة ملفك إلى قائمة الالتزام
على عكس هذا الأمر تمامًا ،
git reset HEAD myfile.txt # سيؤدي هذا إلى التراجععليه.
لذلك ، ستكون في الحالة السابقة. المحدد سيكون مرة أخرى في قائمة غير متتبعة (الحالة السابقة).
سيتم إعادة تعيين رأسك بهذا الملف المحدد. لذلك ، إذا لم يكن ذلك في رأسك ، فسيتم ببساطة إعادة ضبطه.
|
git reset filename.txt
سيتم إزالة ملف باسم filename.txt من الفهرس الحالي ، منطقة "على وشك الالتزام" ، دون تغيير أي شيء آخر.
|
git reset filename.txt
سيتم إزالة ملف باسم filename.txt من الفهرس الحالي ، منطقة "على وشك الالتزام" ، دون تغيير أي شيء آخر.
|
في Sourcetree ، يمكنك القيام بذلك بسهولة عبر واجهة المستخدم الرسومية.
يمكنك التحقق من الأمر الذي يستخدمه Sourcetree لإلغاء ترتيب الملف.
لقد أنشأت ملفًا جديدًا وأضفته إلى Git. ثم قمت بإلغاء تنظيمها باستخدام واجهة المستخدم الرسومية Sourcetree.
هذه هي النتيجة:
Unstaging files [08/12/15 10:43]
git -c diff.mnemonicprefix = false -c core.quotepath = false -c credit.helper = sourcetree reset -q - path / to / file / filename.java
يستخدم Sourcetree إعادة التعيين إلى unstage الملفات الجديدة.
|
1
2
التالى
سؤال نشط للغاية. اكسب 10 سمعة للإجابة على هذا السؤال. تساعد متطلبات السمعة في حماية هذا السؤال من البريد العشوائي ونشاط عدم الإجابة.
ليس الجواب الذي تبحث عنه؟ تصفح الأسئلة الأخرى الموسومة git version-control git-الالتزام git-stage أو اطرح سؤالك الخاص.